home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_unix / j109lxa4.tar / mboxcmd.c < prev    next >
C/C++ Source or Header  |  1994-06-04  |  31KB  |  1,453 lines

  1. /* NOTE: because of size, the previous 'mailbox.c' has been
  2.  * split in 3 parts:
  3.  * mboxcmd.c, containing the 'mbox' subcommands,
  4.  * mailbox.c, containing some user mailbox commands, and
  5.  * mailbox2.c, containing the remaining user commands.
  6.  * 921125 - WG7J
  7.  */
  8. /* There are only two functions in this mailbox code that depend on the
  9.  * underlying protocol, namely mbx_getname() and dochat(). All the other
  10.  * functions can hopefully be used without modification on other stream
  11.  * oriented protocols than AX.25 or NET/ROM.
  12.  *
  13.  * SM0RGV 890506, most work done previously by W9NK
  14.  *
  15.  *** Changed 900114 by KA9Q to use newline mapping features in stream socket
  16.  *      interface code; everything here uses C eol convention (\n)
  17.  *
  18.  *      Numerous new commands and other changes by SM0RGV, 900120
  19.  *
  20.  * Gateway function now support outgoing connects with the user's call
  21.  * with inverted ssid. Users can connect to system alias as well...
  22.  * See also several mods in socket.c,ax25.c and others
  23.  * 11/15/91, WG7J/PA3DIS
  24.  *
  25.  * Userlogging, RM,VM and KM commands, and R:-line interpretation
  26.  * added 920307 and later, Johan. K. Reinalda, WG7J/PA3DIS
  27.  *
  28.  * Inactivity timeout-disconnect added 920325 and later - WG7J
  29.  *
  30.  */
  31. #include <stdio.h>
  32. #ifdef MSDOS
  33. #include <io.h>
  34. #endif
  35. #include <time.h>
  36. #include <ctype.h>
  37. #ifdef MSDOS
  38. #include <alloc.h>
  39. #endif
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <time.h>
  43. #ifdef  UNIX
  44. #include <sys/types.h>
  45. #include <sys/stat.h>
  46. #endif
  47. #ifdef MSDOS
  48. #include <dir.h>
  49. #include <dos.h>
  50. #endif
  51. #include "global.h"
  52. #include "config.h"
  53. #include "timer.h"
  54. #include "proc.h"
  55. #include "socket.h"
  56. #include "usock.h"
  57. #include "session.h"
  58. #include "smtp.h"
  59. #include "dirutil.h"
  60. #include "telnet.h"
  61. #include "ftp.h"
  62. #include "ftpserv.h"
  63. #include "commands.h"
  64. #include "netuser.h"
  65. #include "files.h"
  66. #include "bm.h"
  67. #include "pktdrvr.h"
  68. #include "ax25.h"
  69. #include "mailbox.h"
  70. #include "ax25mail.h"
  71. #include "nr4mail.h"
  72. #include "cmdparse.h"
  73. #include "mailfor.h"
  74.  
  75. #ifdef MAILBOX
  76.  
  77. /*
  78. #define MBDEBUG
  79. */
  80.  
  81. extern int dombmovemail __ARGS((int argc,char *argv[],void *p));
  82. extern char Myalias[];
  83.  
  84. extern struct mbx *Mbox;
  85. extern int BbsUsers;
  86. extern int Totallogins;
  87. char *Mtmsg;
  88. int MAttended = 0;
  89. unsigned Maxlet = BM_NLET;
  90. char Mbpasswd[MAXPWDLEN+1] = "";
  91. struct no_js *Exclude = (struct no_js *)NULL;
  92.  
  93. #ifdef MBFWD
  94. char *Mbzip = NULLCHAR;
  95. char *Mbqth = NULLCHAR;
  96. char *Mbhaddress = NULLCHAR;
  97. char *Mbfwdinfo = NULLCHAR;
  98. int Mbsmtptoo = 0;
  99. int Mtrace = 0;
  100. #endif
  101.  
  102. extern int MbSent;
  103. extern int MbRead;
  104. extern int MbRecvd;
  105. #ifdef MBFWD
  106. extern int MbForwarded;
  107. #endif
  108.  
  109. #ifdef AX25
  110. static char Uplink[] =     "Uplink   (%s)";
  111. static char Downlink[] =   "Downlink (%s)";
  112. #endif
  113. #ifdef NETROM
  114. static char incircuit[]  = "Circuit  (%s%s%s %s)";
  115. static char outcircuit[] = "Circuit  (%s%s%s)";
  116. #endif
  117. static char Telnet[] =     "Telnet   (%s @ %s)";
  118. static char Telnetdown[] = "Telnet   (%s)";
  119. static char Local[] =      "Local    (%s)";
  120.  
  121. static int doattend __ARGS((int argc,char *argv[],void *p));
  122. static int domaxmsg __ARGS((int argc,char *argv[],void *p));
  123. /*static int dotimeout __ARGS((int argc,char *argv[],void *p));*/
  124. int dombusers __ARGS((int argc,char *argv[],void *p));
  125. static int dombpast __ARGS((int argc,char *argv[],void *p));
  126. /*static int doarea __ARGS((int argc,char *argv[],void *p));*/
  127. static int dojumpstart __ARGS((int argc,char *argv[],void *p));
  128. static int dombnrid __ARGS((int argc,char *argv[],void *p));
  129. static int dombpasswd __ARGS((int argc,char *argv[],void *p));
  130. static int dombsecure __ARGS((int argc,char *argv[],void *p));
  131. static int dombtrace __ARGS((int argc,char *argv[],void *p));
  132. static int dombzipcode __ARGS((int argc,char *argv[],void *p));
  133. static int dombfwdinfo __ARGS((int argc,char *argv[],void *p));
  134. static int dombqth __ARGS((int argc,char *argv[],void *p));
  135. static int dombhaddress __ARGS((int argc,char *argv[],void *p));
  136. static int dombsmtptoo __ARGS((int argc,char *argv[],void *p));
  137. static int dombutc __ARGS((int argc,char *argv[],void *p));
  138. extern int dombmailfor __ARGS((int argc,char *argv[],void *p));
  139. extern int dombstatus __ARGS((int argc,char *argv[],void *p));
  140. static int dombmailstats __ARGS((int argc,char *argv[],void *p));
  141. static int dombtdisc __ARGS((int argc,char *argv[],void *p));
  142. static int dombtmsg __ARGS((int argc,char *argv[],void *p));
  143. static int dombconvers __ARGS((int argc,char *argv[],void *p));
  144. /*static int dombloophold __ARGS((int argc,char *argv[],void *p));*/
  145. static int dombsendquery __ARGS((int argc,char *argv[],void *p));
  146. static int dombmport __ARGS((int argc,char *argv[],void *p));
  147. static int dombnewmail __ARGS((int argc,char *argv[],void *p));
  148. static int dombhideport __ARGS((int argc,char *argv[],void *p));
  149. static int dombheader __ARGS((int argc,char *argv[],void *p));
  150. static int dombnobid __ARGS((int argc,char *argv[],void *p));
  151. static int dombnoax25 __ARGS((int argc,char *argv[],void *p));
  152. static int dombbonly __ARGS((int argc,char *argv[],void *p));
  153. static int dombuonly __ARGS((int argc,char *argv[],void *p));
  154. static int dombsonly __ARGS((int argc,char *argv[],void *p));
  155. static struct pu *pu_lookup __ARGS((char *name));
  156. void updatedefaults __ARGS((struct mbx *m));
  157.  
  158. int Mbjumpstart = 1;
  159. int Usenrid;
  160. int MBSecure;
  161.  
  162. #ifdef MAILCMDS
  163. int Mbsendquery = 1;
  164. int NoBid;
  165. #ifdef USERLOG
  166. int Mbnewmail = 1;
  167. #endif
  168. #endif
  169.  
  170. #ifdef MBXTDISC
  171. int32 Mbtdiscinit;
  172. #endif
  173.  
  174. /* mbox subcommand table */
  175. static struct cmds Mbtab[] = {
  176.     "attend",       doattend,       0, 0, NULLCHAR,
  177. #ifdef CONVERS
  178.     "convers",  dombconvers,0, 0, NULLCHAR,
  179. #endif
  180. #ifdef MAILCMDS
  181. #ifdef MBFWD
  182.     "fwdinfo",  dombfwdinfo,0, 0, NULLCHAR,
  183.     "haddress", dombhaddress,0,0, NULLCHAR,
  184.     "header",   dombheader, 0, 0, NULLCHAR,
  185. #endif
  186. #endif
  187. #ifdef AX25
  188.     "hideport", dombhideport, 0,0, NULLCHAR,
  189.     "jumpstart", dojumpstart,0, 0, NULLCHAR,
  190. #ifdef MAILCMDS
  191. #ifdef MBFWD
  192. #ifdef RLINE
  193.     "kick",     dombkick,   0, 0, NULLCHAR,
  194. #endif
  195. #endif
  196. #endif
  197. #endif
  198. #ifdef MAILCMDS
  199. #ifdef MAILFOR
  200. #ifdef AX25
  201.     "mailfor",  dombmailfor,0, 0, NULLCHAR,
  202. #endif
  203. #endif
  204.     "maxmsg",   domaxmsg,   0, 0, NULLCHAR,
  205. #ifdef AX25
  206.     "mport",    dombmport,  0, 0, NULLCHAR,
  207. #ifdef USERLOG
  208.     "newmail",  dombnewmail,0, 0, NULLCHAR,
  209. #endif
  210. #endif /* MAILCMDS */
  211.     "nobid",  dombnobid,  0, 0, NULLCHAR,
  212.     "nrid",     dombnrid,   0, 0, NULLCHAR,
  213. #endif
  214.     "past",     dombpast,   0, 0, NULLCHAR,
  215.     "password", dombpasswd, 0, 0, NULLCHAR,
  216. #ifdef MAILCMDS
  217.     "mailstats",dombmailstats,0,0,NULLCHAR,
  218. #ifdef MBFWD
  219.     "qth",      dombqth,    0, 0, NULLCHAR,
  220. #endif
  221. #endif /* MAILCMDS */
  222.     "secure",   dombsecure, 0, 0, NULLCHAR,
  223. #ifdef MAILCMDS
  224.     "sendquery",dombsendquery,0,0,NULLCHAR,
  225. #ifdef MBFWD
  226.     "smtptoo",  dombsmtptoo,0, 0, NULLCHAR,
  227. #endif
  228. #endif
  229.     "status",   dombstatus,  0, 0, NULLCHAR,
  230. #ifdef MAILCMDS
  231. #ifdef  AX25
  232. #ifdef MBFWD
  233.     "timer",        dombtimer,      0, 0, NULLCHAR,
  234. #endif
  235. #endif
  236. #endif
  237. #ifdef MBXTDISC
  238.     "tdisc",    dombtdisc,  0, 0, NULLCHAR,
  239. #endif
  240.     "tmsg",     dombtmsg,   0, 0, NULLCHAR,
  241. #ifdef MAILCMDS
  242. #ifdef MBFWD
  243.     "trace",    dombtrace,  0, 0, NULLCHAR,
  244.     "utc",      dombutc,    0, 0, NULLCHAR,
  245.     "zipcode",  dombzipcode,0, 0, NULLCHAR,
  246. #endif
  247. #endif
  248.     "noax25",   dombnoax25, 0, 0, NULLCHAR,
  249.     "bbsonly",  dombbonly,  0, 0, NULLCHAR,
  250.     "usersonly",dombuonly,  0, 0, NULLCHAR,
  251.     "sysoponly",dombsonly, 0, 0, NULLCHAR,
  252.     NULLCHAR,
  253. };
  254.  
  255. char Mbnrid[20];
  256.  
  257. /*set the mailbox netrom id*/
  258. void
  259. setmbnrid() {
  260.     char tmp[AXBUF];
  261.     char tmp2[AXBUF];
  262. #ifndef AX25
  263.     char *cp;
  264. #endif
  265.  
  266. #ifdef NETROM
  267.     if(Nr_iface != NULLIF) { /* Use netrom call, and alias (if exists) */
  268.     if(*Myalias != '\0')
  269.         sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),
  270.             pax25(tmp2,Nr_iface->hwaddr));
  271.     else
  272.         sprintf(Mbnrid,"%s ",pax25(tmp,Nr_iface->hwaddr));
  273.     return;
  274.     }
  275.     /* Use Mycall, and alias (if exists) */
  276.     if(*Myalias != '\0')
  277.     sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),pax25(tmp2,Mycall));
  278.     else
  279. #endif
  280. #ifdef AX25
  281.     sprintf(Mbnrid,"%s ",pax25(tmp,Mycall));
  282. #else
  283.     strncpy(Mbnrid,Hostname,19);
  284.     if((cp = strchr(Mbnrid,'.')) != NULLCHAR)
  285.         *cp = '\0';
  286. #endif
  287.     return;
  288. }
  289.  
  290. /*This is a dummy called from the main command interpreter,
  291.  *setup a mbx structure so dombusers() works correct - WG7J
  292.  */
  293. int
  294. dombstatus(argc,argv,p)
  295. int argc;
  296. char *argv[];
  297. void *p;
  298. {
  299.     struct mbx m;
  300.  
  301.     m.privs = SYSOP_CMD;
  302.     m.stype = ' ';
  303.     return dombusers(0,NULL,&m);
  304. }
  305.  
  306. int
  307. dombox(argc,argv,p)
  308. int argc;
  309. char *argv[];
  310. void *p;
  311. {
  312.     if(argc == 1)
  313.     return dombstatus(0,NULL,NULL);
  314.     return subcmd(Mbtab,argc,argv,p);
  315. }
  316.  
  317. #ifdef AX25
  318.  
  319. static int
  320. dombhideport(int argc, char *argv[], void *p)
  321. {
  322.     return setflag(argc,argv[1],HIDE_PORT,argv[2]);
  323. }
  324.  
  325. static int
  326. dojumpstart(argc,argv,p)
  327. int argc;
  328. char *argv[];
  329. void *p;
  330. {
  331.     register int i;
  332.     char tmp[AXBUF];
  333.     struct no_js *ep;
  334.  
  335.     if(*argv[1] == 'e') {
  336.         /*the exclude subcommand*/
  337.         if(argc == 2) { /*just list them*/
  338.             for(ep=Exclude;ep!=(struct no_js *)NULL;ep=ep->next)
  339.                 tprintf("%s ",pax25(tmp,ep->call));
  340.             tputc('\n');
  341.         } else { /*add some call(s)*/
  342.             for(i=0;i<argc-2;i++) {
  343.                 ep = callocw(1,sizeof(struct no_js));
  344.                 if(setcall(ep->call,argv[i+2]) == -1){
  345.                     tprintf("Invalid call: %s\n",argv[i+2]);
  346.                     free(ep);
  347.                 } else { /* add to list */
  348.                     ep->next = Exclude;
  349.                     Exclude = ep;
  350.                 }
  351.             }
  352.         }
  353.         return 0;
  354.     }
  355.     return setbool(&Mbjumpstart,"Jump start on connect",argc,argv);
  356. }
  357.  
  358. static int
  359. dombnrid(argc,argv,p)
  360. int argc;
  361. char *argv[];
  362. void *p;
  363. {
  364.     return setbool(&Usenrid,"Netrom id prompt",argc,argv);
  365. }
  366.  
  367. #ifdef MAILCMDS
  368. static int
  369. dombmport(argc,argv,p)
  370. int argc;
  371. char *argv[];
  372. void *p;
  373. {
  374.     return setflag(argc,argv[1],MAIL_BEACON,argv[2]);
  375. }
  376. #endif
  377. #endif /* AX25 */
  378.  
  379. #ifdef MAILCMDS
  380.  
  381. static int
  382. dombnobid(argc,argv,p)
  383. int argc;
  384. char *argv[];
  385. void *p;
  386. {
  387.     return setbool(&NoBid,"Accept Buls without BID",argc,argv);
  388. }
  389.  
  390. static int
  391. dombsendquery(argc,argv,p)
  392. int argc;
  393. char *argv[];
  394. void *p;
  395. {
  396.     return setbool(&Mbsendquery,"query after send",argc,argv);
  397. }
  398.  
  399. #ifdef USERLOG
  400.  
  401. static int
  402. dombnewmail(argc,argv,p)
  403. int argc;
  404. char *argv[];
  405. void *p;
  406. {
  407.     return setbool(&Mbnewmail,"show new area mail",argc,argv);
  408. }
  409. #endif
  410. #endif
  411.  
  412. #ifdef CONVERS
  413. int Mbconverse = 1;
  414.  
  415. static int
  416. dombconvers(argc,argv,p)
  417. int argc;
  418. char *argv[];
  419. void *p;
  420. {
  421.     return setbool(&Mbconverse,"Mbox convers",argc,argv);
  422. }
  423. #endif
  424.  
  425. /* if unattended mode is set, ax25, telnet and maybe other sessions will
  426.  * be restricted.
  427.  */
  428. static int
  429. doattend(argc,argv,p)
  430. int argc;
  431. char *argv[];
  432. void *p;
  433. {
  434.     return setbool(&MAttended,"Mailbox Attended flag",argc,argv);
  435. }
  436.  
  437. #ifdef MAILCMDS
  438. static int
  439. domaxmsg(argc,argv,p)
  440. int argc;
  441. char *argv[];
  442. void *p;
  443. {
  444.     return setuns(&Maxlet,"Maximum messages per area",argc,argv);
  445. }
  446. #endif
  447.  
  448. #ifdef MBXTDISC
  449. /* Set mailbox redundancy timer */
  450. static int
  451. dombtdisc(argc,argv,p)
  452. int argc;
  453. char *argv[];
  454. void *p;
  455. {
  456.     return setlong(&Mbtdiscinit,"Mbox redundancy timer (sec)",argc,argv);
  457. }
  458. #endif
  459.  
  460. #ifdef MAILCMDS
  461. #ifdef MBFWD
  462. int Mbheader;
  463.  
  464. extern int ThirdParty;
  465.  
  466. static int
  467. dombheader(argc,argv,p)
  468. int argc;
  469. char *argv[];
  470. void *p;
  471. {
  472.     int retval;
  473.  
  474.     retval = setbool(&Mbheader,"R: header",argc,argv);
  475.     if(!Mbheader)
  476.     ThirdParty = 0;
  477.     return retval;
  478. }
  479.  
  480. static int
  481. dombsmtptoo(argc,argv,p)
  482. int argc;
  483. char *argv[];
  484. void *p;
  485. {
  486.     return setbool(&Mbsmtptoo,"Bbs forwards SMTP headers",argc,argv);
  487. }
  488. #endif
  489. #endif
  490.  
  491. static int
  492. dombpasswd(argc,argv,p)
  493. int argc;
  494. char *argv[];
  495. void *p;
  496. {
  497.     int len;
  498.  
  499.     /*Only allowed from keyboard*/
  500.     if(Curproc->input != Command->input) {
  501.         tputs(Noperm);
  502.         return 0;
  503.     }
  504.     if(argc != 2) {
  505.     tputs("Usage: mbox password \"<sysop password>\"\n");
  506.         return 0;
  507.     }
  508.     if((len=strlen(argv[1])) == 0)
  509.     return 0;       /* zero length, don't reset */
  510.  
  511.     if(len > MAXPWDLEN) {
  512.     tputs("Too long\n");
  513.     return 0;
  514.     }
  515.     strcpy(Mbpasswd,argv[1]);
  516.     return 0;
  517. }
  518.  
  519. static int
  520. dombtmsg(argc,argv,p)
  521. int argc;
  522. char *argv[];
  523. void *p;
  524. {
  525.     if(argc > 2) {
  526.     tputs("Usage: mbox tmsgs \"<your message>\"\n");
  527.         return 0;
  528.     }
  529.  
  530.     if(argc < 2) {
  531.     if(Mtmsg != NULLCHAR)
  532.         tputs(Mtmsg);
  533.     }
  534.     else {
  535.     if(Mtmsg != NULLCHAR){
  536.         free(Mtmsg);
  537.         Mtmsg = NULLCHAR;   /* reset the pointer */
  538.         }
  539.         if(!strlen(argv[1]))
  540.             return 0;               /* clearing the buffer */
  541.     Mtmsg = mallocw(strlen(argv[1])+5);/* allow for the EOL char */
  542.     strcpy(Mtmsg, argv[1]);
  543.     strcat(Mtmsg, "\n");        /* add the EOL char */
  544.     }
  545.     return 0;
  546. }
  547.  
  548. #ifdef MAILCMDS
  549. #ifdef MBFWD
  550. signed int UtcOffset=0;
  551.  
  552. /*Set the difference between Local time, and UTC !*/
  553. static int
  554. dombutc(argc,argv,p)
  555. int argc;
  556. char *argv[];
  557. void *p;
  558. {
  559.     if(argc < 2) {
  560.     tputs("Local Time is UTC");
  561.     if(UtcOffset == 0)
  562.         tputc('\n');
  563.     else {
  564.         if(UtcOffset > 0)
  565.         tputc('+');
  566.         tprintf("%d\n",UtcOffset);
  567.     }
  568.     return 0;
  569.     }
  570.     UtcOffset = atoi(argv[1]);
  571.     return 0;
  572. }
  573.  
  574. /*Set the ZIP to be used in the R: line when forwarding */
  575. static int
  576. dombzipcode(argc,argv,p)
  577. int argc;
  578. char *argv[];
  579. void *p;
  580. {
  581.     int len;
  582.  
  583.     if(argc > 2) {
  584.     tputs("Usage: mbox zipcode <your zip>\n");
  585.         return 0;
  586.     }
  587.  
  588.     if(argc < 2) {
  589.     if(Mbzip != NULLCHAR)
  590.         tprintf("%s\n",Mbzip);
  591.     }
  592.     else {
  593.     len = strlen(argv[1]);
  594. #ifdef notdef
  595.     /*check for a valid zip - this is for USA only!!! - WG7J*/
  596.     if( (len != 5) || !(atol(argv[1])) ){
  597.         tprintf("%s: Invalid, should be 5 digits!\n",argv[1]);
  598.         return 0;
  599.     }
  600. #endif
  601.     if(Mbzip != NULLCHAR){
  602.         free(Mbzip);
  603.         Mbzip = NULLCHAR;   /* reset the pointer */
  604.         }
  605.     if(len == 0)
  606.             return 0;               /* clearing the buffer */
  607.     Mbzip = mallocw((unsigned)len+1); /* room for \0 */
  608.     strcpy(Mbzip, argv[1]);
  609.     }
  610.     return 0;
  611. }
  612.  
  613. /* Set the QTH to be used in R: line when forwarding*/
  614. static int
  615. dombqth(argc,argv,p)
  616. int argc;
  617. char *argv[];
  618. void *p;
  619. {
  620.     if(argc > 2) {
  621.     tputs("Usage: mbox qth <your qth> || \"<your qth, state>\"\n");
  622.         return 0;
  623.     }
  624.  
  625.     if(argc < 2) {
  626.     if(Mbqth != NULLCHAR)
  627.         tprintf("%s\n",Mbqth);
  628.     }
  629.     else {
  630.     if(Mbqth != NULLCHAR){
  631.         free(Mbqth);
  632.         Mbqth = NULLCHAR;   /* reset the pointer */
  633.         }
  634.         if(!strlen(argv[1]))
  635.             return 0;               /* clearing the buffer */
  636.     Mbqth = mallocw(strlen(argv[1]) + 1);
  637.     strcpy(Mbqth, argv[1]);
  638.     }
  639.     return 0;
  640. }
  641.  
  642. /*Set the hierachical address to be used in R: line when forwarding*/
  643. static int
  644. dombhaddress(argc,argv,p)
  645. int argc;
  646. char *argv[];
  647. void *p;
  648. {
  649.     if(argc > 2) {
  650.     tputs("Usage: mbox haddress <your H-address (WITH call)>\n");
  651.         return 0;
  652.     }
  653.  
  654.     if(argc < 2) {
  655.     if(Mbhaddress != NULLCHAR)
  656.         tprintf("%s\n",Mbhaddress);
  657.     }
  658.     else {
  659.     if(Mbhaddress != NULLCHAR){
  660.         free(Mbhaddress);
  661.         Mbhaddress = NULLCHAR;   /* reset the pointer */
  662.         }
  663.         if(!strlen(argv[1]))
  664.             return 0;               /* clearing the buffer */
  665.     Mbhaddress = mallocw(strlen(argv[1]) + 1);
  666.     strcpy(Mbhaddress, argv[1]);
  667.     /*make sure the're upper case*/
  668.     strupr(Mbhaddress);
  669.     }
  670.     return 0;
  671. }
  672.  
  673. /*Set the R: line [info] to be used when forwarding*/
  674. static int
  675. dombfwdinfo(argc,argv,p)
  676. int argc;
  677. char *argv[];
  678. void *p;
  679. {
  680.     if(argc > 2) {
  681.     tputs("Usage: mbox fwdinfo \"<your R:-line [info]>\"\n");
  682.         return 0;
  683.     }
  684.  
  685.     if(argc < 2) {
  686.     if(Mbfwdinfo != NULLCHAR)
  687.         tprintf("%s\n",Mbfwdinfo);
  688.     }
  689.     else {
  690.     if(Mbfwdinfo != NULLCHAR){
  691.         free(Mbfwdinfo);
  692.         Mbfwdinfo = NULLCHAR;   /* reset the pointer */
  693.         }
  694.         if(!strlen(argv[1]))
  695.             return 0;               /* clearing the buffer */
  696.     Mbfwdinfo = mallocw(strlen(argv[1]) + 1);
  697.     strcpy(Mbfwdinfo, argv[1]);
  698.     }
  699.     return 0;
  700. }
  701. #endif /*MBFWD*/
  702. #endif
  703.  
  704. /* Keep track of all past users */
  705. struct pu {
  706.     struct pu *next;    /* next one in list */
  707.     char name[20];              /* user name */
  708. #ifdef notdef
  709.     int family;                 /* how did user come in last */
  710. #endif
  711.     int32 time;                 /* When was the last login ? */
  712.     int number;                 /* Number of times logged in */
  713. };
  714. #define NULLPU (struct pu *)NULL
  715. struct pu *Pu = NULLPU;
  716.  
  717. /* Look up an entry in the users-list*/
  718. static
  719. struct pu *
  720. pu_lookup(name)
  721. char *name;
  722. {
  723.     register struct pu *ppu;
  724.     struct pu *pulast = NULLPU;
  725.  
  726.     for(ppu = Pu;ppu != NULLPU;pulast = ppu,ppu = ppu->next){
  727.     if(!strcmp(name,ppu->name)){ /* found it! */
  728.         if(pulast != NULLPU){
  729.                 /* Move entry to top of list */
  730.         pulast->next = ppu->next;
  731.         ppu->next = Pu;
  732.         Pu = ppu;
  733.             }
  734.         return ppu;
  735.         }
  736.     }
  737.     return NULLPU;
  738. }
  739.  
  740. /*Log all users of the mailbox*/
  741. /* This gets kept track of in the file name UDefaults */
  742. /* format is
  743. user datestamp options
  744. where options are separated by spaces
  745. M# - use more with # lines
  746. A - use area indiation
  747. X - use expert status
  748. N - use netrom lookalike prompt
  749. */
  750.  
  751. #ifdef USERLOG
  752.  
  753. /* Write the new defaults - WG7J */
  754. void
  755. #ifdef PROTOTYPES
  756. updatedefaults(struct mbx *m)
  757. #else
  758. updatedefaults(m)
  759. struct mbx *m;
  760. #endif
  761. {
  762.     FILE *Ufile, *tfile;
  763.     char buf[256];
  764.     char *cp;
  765.     time_t t;
  766.  
  767.     /* Save old defaults file to backup */
  768.     unlink(UDefbak);
  769.     if(rename(UDefaults,UDefbak))
  770.     return;
  771.  
  772.     /*Write all users back, but update this one!*/
  773.     if((Ufile = fopen(UDefaults,"w")) == NULLFILE)
  774.     /* Can't create defaults file ???*/
  775.     return;
  776.  
  777.     if((tfile = fopen(UDefbak,"r")) == NULLFILE) {
  778.     /* What on earth happened ???? */
  779.     fclose(Ufile);
  780.     return;
  781.     }
  782.     while(fgets(buf,sizeof(buf),tfile) != NULLCHAR) {
  783.     if((cp=strchr(buf,' ')) != NULLCHAR)
  784.         *cp = '\0';
  785.     if(!stricmp(m->name,buf)) {
  786.         /*found this user*/
  787.         time(&t);
  788.         sprintf(buf,"%s %lu M%d %c %c %c C%c\n",
  789.             m->name,t,m->morerows,
  790.             (m->sid&MBX_AREA) ? 'A' : ' ' ,
  791.             (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  792.             (m->sid&MBX_NRID) ? 'N' : ' ',
  793.             (m->family == AF_AX25) ? 'A' : \
  794.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  795.     } else
  796.         *cp = ' '; /* restore the space !*/
  797.     fputs(buf,Ufile);
  798.     }
  799.     fclose(tfile);
  800.     fclose(Ufile);
  801.     return;
  802. }
  803.  
  804. #ifdef MAILCMDS
  805. /* scan the areaname.inf files for datestamps > m->last.
  806.  * these are areas that have new mail received since the user
  807.  * last logged in. - WG7J
  808.  */
  809. void listnewmail(struct mbx *m) {
  810.     char path[129];
  811.     struct ffblk sbuf;
  812. #ifndef UNIX
  813.     struct ftime ft;
  814.     struct date dt;
  815.     struct time ti;
  816. #endif
  817.     long t;
  818.     int rval;
  819.     int firstone;
  820.     int column;
  821.  
  822.     /* set the path were the timestamp files live */
  823.     sprintf(path,"%s/*.inf",Mailspool);
  824.  
  825.     /* find the first, if any */
  826.     rval = findfirst(path,&sbuf,0);
  827.  
  828.     /* check them all */
  829.     firstone = 1;
  830.     column = 0;
  831.     while(rval != -1) {
  832.     /* get the timestamp */
  833. #ifdef UNIX
  834.     t = mktime(&sbuf.ff_ftime);
  835. #else
  836.     ft = *((struct ftime *)&sbuf.ff_ftime);
  837.     /* Now somehow translate this *&%#@ DOS format to unix timestamp */
  838.     dt.da_year = 1980 + ft.ft_year;
  839.     dt.da_mon = ft.ft_month;
  840.     dt.da_day = ft.ft_day;
  841.     ti.ti_hour = ft.ft_hour;
  842.     ti.ti_min = ft.ft_min;
  843.     ti.ti_sec = ft.ft_tsec;
  844.     ti.ti_hund = 0;
  845.     t = dostounix(&dt,&ti);
  846. #endif
  847.  
  848.     /* Is there new mail here ? */
  849.     if(m->last < t) {
  850.         /* cut off the extension */
  851.         *strchr(sbuf.ff_name,'.') = '\0';
  852.  
  853.         if(firstone) {
  854.         tprintf("New mail in: %s  ",sbuf.ff_name);
  855.         firstone = 0;
  856.         column = 2;
  857.         } else {
  858.         tprintf("%s  ",sbuf.ff_name);
  859.         if(column++ == 6)
  860.             tputc('\n');
  861.         }
  862.     }
  863.     /* find next one */
  864.     rval = findnext(&sbuf);
  865.     }
  866.     if(!firstone)
  867.     tputc('\n');
  868.     return;
  869. }
  870.  
  871. #endif /* USERLOG */
  872. #endif MAILCMDS
  873.  
  874. int DiffUsers;
  875.  
  876. void
  877. loguser(m)
  878. struct mbx *m;
  879. {
  880.     register struct pu *pu;
  881. #ifdef USERLOG
  882.     FILE *Ufile;
  883.     char buf[256];
  884.     char *cp;
  885.     int found=0;
  886.     int xpert = 0;
  887. #endif
  888.  
  889.     if((pu = pu_lookup(m->name)) == NULLPU) {   /* not 'known' user */
  890.     pu = (struct pu *)callocw(1,sizeof(struct pu));
  891.     strcpy(pu->name,m->name);
  892.     pu->next = Pu;
  893.     Pu = pu;
  894.     DiffUsers++;    /* A new guy */
  895.     }
  896. #ifdef notdef
  897.     pu->family = m->family;
  898. #endif
  899.     pu->time = secclock();
  900.     pu->number++;
  901.  
  902. #ifdef USERLOG
  903.     /* Now get options from the userdefaults file, and add timestamp */
  904.     if(!(m->sid&MBX_SID)) { /* only if not a bbs */
  905.     sprintf(buf,"%s",UDefaults);
  906.     if ((Ufile = fopen(buf,"r+")) == NULLFILE) {
  907.         /* default file doesn't exist, create it */
  908.         if((Ufile = fopen(buf,"w")) == NULLFILE)
  909.         return;
  910.         /* Add this user as first one,
  911.          * default uses Area indication
  912.          */
  913.         sprintf(buf,"%s 0 M%d A %c %c C%c\n",
  914.             m->name,m->morerows,
  915.             (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  916.             (m->sid&MBX_NRID) ? 'N' : ' ',
  917.             (m->family == AF_AX25) ? 'A' : \
  918.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  919.         fputs(buf,Ufile);
  920.         fclose(Ufile);
  921.         m->sid |= MBX_AREA;
  922.         m->last = 0L;
  923.         if(Usenrid)
  924.         m->sid |= MBX_NRID;
  925.         return;
  926.     }
  927.     /* Find user in the default file */
  928.     while(!found) {
  929.         if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
  930.         break;
  931.         /* single out the name */
  932.         if((cp=strchr(buf,' ')) != NULLCHAR)
  933.         *cp++ = '\0';
  934.         /* compare the name */
  935.         if(!stricmp(m->name,buf)) {
  936.         /* found user, now scan the options used */
  937.         found = 1;
  938.         fclose(Ufile);
  939.         /* first read last login time */
  940.         m->last = atol(cp);
  941.         while(*cp != '\0') {
  942.             while(*cp == ' ')   /*skip blanks*/
  943.             cp++;
  944.             switch(*cp){
  945.             case 'C':
  946.                 /* All options end BEFORE the CT/CN or CA */
  947.                 *(cp+1) = '\0';
  948.                 break;
  949.             case 'M':
  950.                 cp++;
  951.                 m->morerows = atoi(cp);
  952.                 break;
  953.             case 'A':
  954.                 m->sid |= MBX_AREA;
  955.                 break;
  956.             case 'X':
  957.                 m->sid |= MBX_EXPERT;
  958.                 xpert = 1;
  959.                 break;
  960.             case 'N':
  961.                 m->sid |= MBX_NRID;
  962.                 break;
  963.             }
  964.             cp++;
  965.         }
  966.         }
  967.     } /* while(!found)*/
  968.     if(found) {
  969.         /* add the new timestamp to the defaults file */
  970.         if(!xpert)
  971.         m->sid &= ~MBX_EXPERT;
  972.     } else {
  973.         /* a new one, add to the end (where we now should be!)*/
  974.         m->last = 0L;
  975.         sprintf(buf,"%s 0 M%d A %c %c C%c\n",
  976.             m->name,m->morerows,
  977.             (m->sid & MBX_EXPERT) ? 'X' : ' ' ,
  978.             (Usenrid) ? 'N' : ' ' ,
  979.             (m->family == AF_AX25) ? 'A' : \
  980.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  981.         fputs(buf,Ufile);
  982.         fclose(Ufile);
  983.         m->sid |= MBX_AREA;
  984.         if(Usenrid)
  985.         m->sid |= MBX_NRID;
  986.     }
  987.     }/* if not bbs */
  988. #endif /* USERLOG */
  989.  
  990. }
  991.  
  992.  
  993. /*List all past users of the mailbox */
  994. static int
  995. dombpast(argc,argv,p)
  996. int argc;
  997. char *argv[];
  998. void *p;
  999. {
  1000.  
  1001.     register struct pu *pu;
  1002.     int col = 0;
  1003.     int max=10000;      /* Large enough :-) */
  1004.     int count=0;
  1005.  
  1006.     if(argc>1)
  1007.     max = atoi(argv[1])-1;
  1008.  
  1009.     tputs("Past users:\n"
  1010.           "User       Logins  Time since last   "
  1011.           "User       Logins  Time since last\n");
  1012.     for (pu=Pu;pu!=NULLPU;pu=pu->next) {
  1013.     if(col)
  1014.             tputs(" : ");
  1015.         tprintf("%-10s    %-4d    %12s",pu->name,pu->number,\
  1016.         tformat(secclock() - pu->time));
  1017.     count++;
  1018.     if(count>max)
  1019.         break;
  1020.     if(col) {
  1021.         col = 0;
  1022.         tputc('\n');
  1023.     } else
  1024.         col = 1;
  1025.     }
  1026.     if(col)
  1027.     tputc('\n');
  1028.     tputc('\n');
  1029.     return 0;
  1030. }
  1031.  
  1032. int
  1033. dombmailstats(argc,argv,p)
  1034. int argc;
  1035. char *argv[];
  1036. void *p;
  1037. {
  1038. #ifdef UNIX
  1039.     tprintf("Up: %s\n"
  1040.         "Logins: %d\n"
  1041.         "Users: %d\n"
  1042.         "Count: %d\n",
  1043.          tformat(secclock()),Totallogins,BbsUsers,DiffUsers);
  1044. #else
  1045.     tprintf("Core: %lu\n"
  1046.         "Up: %s\n"
  1047.         "Logins: %d\n"
  1048.         "Users: %d\n"
  1049.         "Count: %d\n",
  1050.          farcoreleft(),tformat(secclock()),Totallogins,BbsUsers,DiffUsers);
  1051. #endif
  1052.  
  1053. #ifdef MAILCMDS
  1054. #ifdef MBFWD
  1055.     tprintf("Sent: %d\n"
  1056.         "Read: %d\n"
  1057.         "Rcvd: %d\n"
  1058.         "Fwd: %d\n\n",\
  1059.         MbSent,MbRead,MbRecvd,MbForwarded);
  1060. #else
  1061.     tprintf("Sent: %d\n"
  1062.         "Read: %d\n"
  1063.         "Rcvd: %d\n\n",MbSent,MbRead,MbRecvd);
  1064. #endif
  1065. #endif
  1066.     return 0;
  1067. }
  1068.  
  1069. #ifdef USERLOG
  1070.  
  1071. /* Search for info on a certain user in the users.dat file */
  1072. int
  1073. dombuserinfo(argc,argv,p)
  1074. int argc;
  1075. char *argv[];
  1076. void *p;
  1077. {
  1078.     FILE *Ufile;
  1079.     char buf[MBXLINE];
  1080.     int found = 0;
  1081.     time_t t;
  1082.     struct tm *lt;
  1083.     char *cp;
  1084.     char *cp2;
  1085.  
  1086.     cp2 = "TELNET";
  1087.  
  1088.     if((Ufile = fopen(UDefaults,"r")) == NULLFILE) {
  1089.     tputs("Can't find user data\n");
  1090.     return 0;
  1091.     }
  1092.     while( !found && (fgets(buf,MBXLINE,Ufile) != NULLCHAR) ) {
  1093.     if((cp=strchr(buf,' ')) != NULLCHAR)
  1094.         *cp = '\0';
  1095.     if(!stricmp(buf,argv[1])) { /* Found it ! */
  1096.         t = atol(++cp);
  1097.         lt = localtime(&t);
  1098.         if((cp = strchr(cp,'C'))!=NULLCHAR) {
  1099.         cp++;
  1100.         /* How was the connection made ? */
  1101.         switch(*cp) {
  1102.             case 'A':
  1103.             cp2 = "AX.25";
  1104.             break;
  1105.             case 'N':
  1106.             cp2 = "NETROM";
  1107.             break;
  1108.         }
  1109.         }
  1110.         tprintf("%s last connected via %s on %s",argv[1],cp2,asctime(lt));
  1111.         found = 1;
  1112.     }
  1113.     }
  1114.     if(!found)
  1115.     tprintf("%s never connected\n",argv[1]);
  1116.     fclose(Ufile);
  1117.     return 0;
  1118. }
  1119.  
  1120. #endif
  1121.  
  1122. int
  1123. dombusers(argc,argv,p)
  1124. int argc;
  1125. char *argv[];
  1126. void *p;
  1127. {
  1128.     register struct mbx *m,*caller;
  1129.     int len;
  1130.     char *cp, *cp1, fsocket[MAXSOCKSIZE];
  1131.     char upl[40], down[40];
  1132.  
  1133.     struct usock *up, *up1;
  1134.     int s;
  1135.  
  1136. #ifdef NETROM
  1137.     struct nrroute_tab *np;
  1138.     char temp[AXBUF], *cp2, *cp3;
  1139. #endif
  1140.  
  1141.     caller = (struct mbx *) p;
  1142.  
  1143.     if(caller->stype == 'S')
  1144.     return dombmailstats(argc,argv,p);
  1145.  
  1146. #ifdef MAILCMDS
  1147.     if(caller->stype == 'M' && (caller->privs & SYSOP_CMD))
  1148.     return dombmovemail(argc,argv,p);
  1149. #endif
  1150.  
  1151.     if(caller->stype == 'L')
  1152. #ifdef USERLOG
  1153.     if((argc > 1) && (atoi(argv[1]) == 0))
  1154.         return dombuserinfo(argc,argv,p);
  1155.     else
  1156. #endif
  1157.         return dombpast(argc,argv,p);
  1158.  
  1159.     tputs("Users:\n");
  1160.  
  1161.     for(m=Mbox;m;m=m->next) {
  1162.     len = MAXSOCKSIZE;
  1163.     getpeername(m->user,fsocket,&len);
  1164.     cp = strdup(psocket(fsocket));
  1165.  
  1166.     upl[0] = '\0';
  1167.     down[0] = '\0';
  1168.  
  1169.     switch(m->family) {     /* UPLINK */
  1170. #ifdef AX25
  1171.     case AF_AX25:
  1172.            sprintf(upl,Uplink,cp);
  1173.         break;
  1174. #endif
  1175. #ifdef NETROM
  1176.     case AF_NETROM:
  1177.         if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1178.         *cp1 = '\0';
  1179.         cp1 += 3;
  1180.         setcall(temp,cp1);
  1181.         np = find_nrroute(temp);
  1182.         cp2 = strdup(np->alias);
  1183.         if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1184.         *cp3 = '\0';
  1185.     /*
  1186.         if(*cp2 == '#' || *cp2 == '\0')
  1187.         sprintf(upl,incircuit,"","",cp1,cp);
  1188.         else
  1189.      */
  1190.      /* show correct user name when outgoing forward over netrom
  1191.       * problem caused by use of the '.C xxx' lines.
  1192.       */
  1193.         if(m->state == MBX_TRYING || m->state == MBX_FORWARD)
  1194.         sprintf(upl,incircuit,cp2,":",cp1,m->name);
  1195.         else
  1196.         sprintf(upl,incircuit,cp2,":",cp1,cp);
  1197.         free(cp2);
  1198.         break;
  1199. #endif
  1200.     case AF_INET:
  1201.         if((cp1 = strchr(cp,':')) != NULLCHAR)
  1202.         *cp1 = '\0';
  1203.         sprintf(upl,Telnet,m->name,cp);
  1204.         break;
  1205.     case AF_LOCAL:
  1206.         sprintf(upl,Local,Hostname);
  1207.         break;
  1208.     default:
  1209.         strcpy(upl,"Connect");
  1210.         break;
  1211.     }
  1212.     free(cp);
  1213.     tprintf("%-36s",upl);
  1214.  
  1215.     /* Now show what they are doing - WG7J */
  1216.     if(m->state != MBX_GATEWAY)
  1217.         tputs("  -> ");
  1218.     switch(m->state){
  1219.     case MBX_GATEWAY:
  1220.         for(s = SOCKBASE; s < Nusock + SOCKBASE; s++) {
  1221.         if((up = itop(s)) == NULLUSOCK || s == m->user)
  1222.             continue;
  1223.         up1 = itop(m->user);
  1224.         if(up->owner == up1->owner) {
  1225.             getpeername(s,fsocket,&len);
  1226.             cp = strdup(psocket(fsocket));
  1227.             switch(up->type) {
  1228.             case TYPE_TCP:
  1229.             #ifdef notdef
  1230.                 if((cp1 = strchr(cp,':')) != NULLCHAR)
  1231.                 *cp1 = '\0';
  1232.             #endif
  1233.                 sprintf(down,Telnetdown,cp);
  1234.                 break;
  1235. #ifdef AX25
  1236.             case TYPE_AX25I:
  1237.                 /*
  1238.                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1239.                 *cp1 = '\0';
  1240.                 */
  1241.                 sprintf(down,Downlink,cp);
  1242.                 break;
  1243. #endif
  1244. #ifdef NETROM
  1245.             case TYPE_NETROML4:
  1246.                 /*get rid of usercall*/
  1247.                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1248.                 *cp1 = '\0';
  1249.                 cp1 += 3;   /*get rid of ' @ '*/
  1250.                 setcall(temp,cp1);      /*get node call*/
  1251.                 np = find_nrroute(temp);/*find alias, if any*/
  1252.                 cp2 = strdup(np->alias);
  1253.                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1254.                 *cp3 = '\0';
  1255.                 /*
  1256.                 memcpy(cp,m->call,AXALEN);
  1257.                 cp[ALEN] ^= 0x1e;
  1258.                 */
  1259.                 /*
  1260.                 if(*cp2 == '#' || *cp2 == '\0')
  1261.                 sprintf(down,outcircuit,"","",cp1);
  1262.                 else
  1263.                 */
  1264.                 sprintf(down,outcircuit,cp2,":",cp1);
  1265.                 free(cp2);
  1266.                 break;
  1267. #endif
  1268.             case TYPE_LOCAL_STREAM:
  1269.             case TYPE_LOCAL_DGRAM:
  1270.                 sprintf(down,Local,Hostname);
  1271.                 break;
  1272.             default:
  1273.                 strcpy(down,"Connect");
  1274.                 break;
  1275.             }
  1276.             free(cp);
  1277.             tprintf("<--> %s\n",down);
  1278.             break;
  1279.         }
  1280.         }
  1281.         break;
  1282.     case MBX_LOGIN:
  1283.         tputs("Logging in\n");
  1284.         break;
  1285.     case MBX_CMD:
  1286.         tputs("Idle\n");
  1287.         break;
  1288. #ifdef MAILCMDS
  1289.     case MBX_SUBJ:
  1290.     case MBX_DATA:
  1291.         tputs("Sending message\n");
  1292.         break;
  1293. #ifdef MBFWD
  1294.     case MBX_REVFWD:
  1295.         tputs("Reverse Forwarding\n");
  1296.         break;
  1297.     case MBX_TRYING:
  1298.         tputs("Attempting Forward\n");
  1299.         break;
  1300.     case MBX_FORWARD:
  1301.         tputs("Forwarding\n");
  1302.         break;
  1303. #endif
  1304.     case MBX_READ:
  1305.         tputs("Reading message\n");
  1306.         break;
  1307. #endif
  1308.     case MBX_UPLOAD:
  1309.         tputs("Uploading file\n");
  1310.         break;
  1311.     case MBX_DOWNLOAD:
  1312.         tputs("Downloading file\n");
  1313.         break;
  1314. #ifdef CONVERS
  1315.     case MBX_CONVERS:
  1316.         tputs("Convers mode\n");
  1317.         break;
  1318. #endif
  1319.     case MBX_CHAT:
  1320.         tputs("Chatting with sysop\n");
  1321.         break;
  1322.     case MBX_WHAT:
  1323.         tputs("Listing files\n");
  1324.         break;
  1325. #ifdef XMODEM
  1326.     case MBX_XMODEM_RX:
  1327.         tputs("Xmodem Receiving\n");
  1328.         break;
  1329.     case MBX_XMODEM_TX:
  1330.         tputs("Xmodem Sending\n");
  1331.         break;
  1332. #endif
  1333.     }
  1334.     /* Only show callers with sysop-privs who is sysop-mode!
  1335.      * This prevents users from easily learning who's
  1336.      * got SYSOP privs
  1337.      */
  1338.     if(m->state == MBX_SYSOPTRY) {
  1339.         if(caller->privs & SYSOP_CMD)
  1340.         tputs("Attempting Sysop mode\n");
  1341.         else
  1342.         tputs("Idle\n");
  1343.     } else {
  1344.         if(m->state == MBX_SYSOP) {
  1345.         if(caller->privs & SYSOP_CMD)
  1346.             tputs("Sysop mode\n");
  1347.         else
  1348.             tputs("Idle\n");
  1349.         }
  1350.     }
  1351.     }
  1352.     tputc('\n');
  1353.     return 0;
  1354. }
  1355.  
  1356. #ifdef MBFWD
  1357. static int
  1358. dombtrace(argc,argv,p)
  1359. int argc;
  1360. char *argv[];
  1361. void *p;
  1362. {
  1363.     return setbool(&Mtrace,"Mailbox trace flag",argc,argv);
  1364. }
  1365. #endif
  1366.  
  1367. static int
  1368. dombsecure(argc,argv,p)
  1369. int argc;
  1370. char *argv[];
  1371. void *p;
  1372. {
  1373.     return setbool(&MBSecure,"Mailbox gateway secure flag",argc,argv);
  1374. }
  1375.  
  1376. #ifdef CALLBOOK
  1377. char *InetCallserver = NULLCHAR;
  1378. char *InetCallserverport = NULLCHAR;
  1379.  
  1380. int
  1381. doinetcallserver(argc,argv,p)
  1382. int argc;
  1383. char *argv[];
  1384. void *p;
  1385. {
  1386.     if(argc == 1) {
  1387.     if(InetCallserver != NULLCHAR) {
  1388.         tprintf("Server %s, on port %s\n",InetCallserver,InetCallserverport);
  1389.         } else
  1390.             tputs("Not set!\n");
  1391.         return 0;
  1392.     }
  1393.     if(argc == 2) {
  1394.         tputs("Usage: callserver <host> <port>\n");
  1395.         return 0;
  1396.     }
  1397.     /*Check validity of the parameters*/
  1398.     if(resolve(argv[1]) == (int32) 0) {
  1399.         tprintf(Badhost,argv[1]);
  1400.         return 0;
  1401.     }
  1402.     if(atoi(argv[2]) == (int) 0) {
  1403.         tprintf("Bad port %s\n",argv[2]);
  1404.         return 0;
  1405.     }
  1406.     if(InetCallserver != NULLCHAR) {
  1407.     free(InetCallserver);
  1408.     free(InetCallserverport);
  1409.     }
  1410.     InetCallserver = strdup(argv[1]);
  1411.     InetCallserverport = strdup(argv[2]);
  1412.     return 0;
  1413. }
  1414. #endif /* CALLBOOK */
  1415.  
  1416. static int
  1417. dombnoax25(argc,argv,p)
  1418. int argc;
  1419. char *argv[];
  1420. void *p;
  1421. {
  1422.     return setflag(argc,argv[1],NO_AX25,argv[2]);
  1423. }
  1424.  
  1425. static int
  1426. dombbonly(argc,argv,p)
  1427. int argc;
  1428. char *argv[];
  1429. void *p;
  1430. {
  1431.     return setflag(argc,argv[1],BBS_ONLY,argv[2]);
  1432. }
  1433.  
  1434. static int
  1435. dombuonly(argc,argv,p)
  1436. int argc;
  1437. char *argv[];
  1438. void *p;
  1439. {
  1440.     return setflag(argc,argv[1],USERS_ONLY,argv[2]);
  1441. }
  1442.  
  1443. static int
  1444. dombsonly(argc,argv,p)
  1445. int argc;
  1446. char *argv[];
  1447. void *p;
  1448. {
  1449.     return setflag(argc,argv[1],SYSOP_ONLY,argv[2]);
  1450. }
  1451.  
  1452. #endif /* MAILBOX */
  1453.